"""
DjangoBlog URL路由配置模块
定义博客应用的所有URL路径和对应的视图映射
使用Django的path函数定义路由，支持路径参数和类型转换
"""

from django.urls import path
from django.views.decorators.cache import cache_page  # 导入缓存页面装饰器

from . import views  # 导入当前应用的视图模块

app_name = "blog"  # 定义应用命名空间，用于URL反向解析时区分不同应用的同名URL

# URL模式列表，Django会按顺序匹配这些模式
urlpatterns = [
    # 首页路由 - 显示文章列表
    path(
        r'',  # 空路径，匹配根URL（如：/blog/）
        views.IndexView.as_view(),  # 使用IndexView类视图处理请求
        name='index'  # URL名称，用于模板中的{% url %}标签
    ),
    
    # 首页分页路由 - 显示指定页码的文章列表
    path(
        r'page/<int:page>/',  # 路径参数：page（整数类型），匹配如/page/2/
        views.IndexView.as_view(),  # 同样使用IndexView，但会接收page参数
        name='index_page'  # URL名称
    ),
    
    # 文章详情页路由 - 通过年月日和文章ID访问
    path(
        r'article/<int:year>/<int:month>/<int:day>/<int:article_id>.html',  # 多个路径参数
        # 参数说明：
        # - year: 文章发布年份（整数）
        # - month: 文章发布月份（整数）  
        # - day: 文章发布日期（整数）
        # - article_id: 文章唯一ID（整数）
        # 匹配如：/article/2023/10/25/123.html
        views.ArticleDetailView.as_view(),  # 使用文章详情视图
        name='detailbyid'  # URL名称
    ),
    
    # 分类目录页路由 - 显示指定分类的文章列表
    path(
        r'category/<slug:category_name>.html',  # 路径参数：category_name（slug类型）
        # slug类型：只包含字母、数字、连字符和下划线的字符串
        # 匹配如：/category/django.html
        views.CategoryDetailView.as_view(),  # 使用分类详情视图
        name='category_detail'  # URL名称
    ),
    
    # 分类目录分页路由 - 显示指定分类的指定页码
    path(
        r'category/<slug:category_name>/<int:page>.html',  # 两个路径参数
        # 匹配如：/category/django/2.html
        views.CategoryDetailView.as_view(),  # 使用相同的分类视图，但会处理分页
        name='category_detail_page'  # URL名称
    ),
    
    # 作者文章页路由 - 显示指定作者的所有文章
    path(
        r'author/<author_name>.html',  # 路径参数：author_name（字符串类型）
        # 匹配如：/author/john.html
        views.AuthorDetailView.as_view(),  # 使用作者详情视图
        name='author_detail'  # URL名称
    ),
    
    # 作者文章分页路由 - 显示指定作者的指定页码文章
    path(
        r'author/<author_name>/<int:page>.html',  # 两个路径参数
        # 匹配如：/author/john/2.html
        views.AuthorDetailView.as_view(),  # 使用相同的作者视图，处理分页
        name='author_detail_page'  # URL名称
    ),
    
    # 标签页路由 - 显示指定标签的文章列表
    path(
        r'tag/<slug:tag_name>.html',  # 路径参数：tag_name（slug类型）
        # 匹配如：/tag/python.html
        views.TagDetailView.as_view(),  # 使用标签详情视图
        name='tag_detail'  # URL名称
    ),
    
    # 标签分页路由 - 显示指定标签的指定页码文章
    path(
        r'tag/<slug:tag_name>/<int:page>.html',  # 两个路径参数
        # 匹配如：/tag/python/2.html
        views.TagDetailView.as_view(),  # 使用相同的标签视图，处理分页
        name='tag_detail_page'  # URL名称
    ),
    
    # 文章归档页路由 - 显示所有文章的按时间归档
    path(
        'archives.html',  # 固定路径，匹配/archives.html
        cache_page(  # 应用缓存装饰器，缓存整个页面
            60 * 60)(  # 缓存时间：1小时（60分钟 × 60秒）
            views.ArchivesView.as_view()),  # 使用归档视图，并应用缓存
        name='archives'  # URL名称
    ),
    
    # 友情链接页路由 - 显示所有友情链接
    path(
        'links.html',  # 固定路径，匹配/links.html
        views.LinkListView.as_view(),  # 使用链接列表视图
        name='links'  # URL名称
    ),
    
    # 文件上传接口路由 - 处理图片等文件上传
    path(
        r'upload',  # 路径，匹配/upload
        views.fileupload,  # 使用函数视图处理文件上传
        name='upload'  # URL名称
    ),
    
    # 缓存清理接口路由 - 手动清理系统缓存
    path(
        r'clean',  # 路径，匹配/clean
        views.clean_cache_view,  # 使用函数视图清理缓存
        name='clean'  # URL名称
    ),
]